package com.example.mycnblog.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class PasswordUtils {
    //1.加盐并生成密码
    public static String encrypt(String password){
        //盐值   UUID会生成36位 其中四位是 -  这里我们约定盐值为32位
        String salt= UUID.randomUUID().toString().replace("-","");
        //生成加盐之后的密码    md5加密  标准MD5加密为128位  用16进制表示就是32位
        String saltPassword= DigestUtils.md5DigestAsHex((salt+password).getBytes());
        //生成最终密码  保存到数据库  约定：32位盐值+$+32位加盐之后的密码
        String finalPassword=salt+"$"+saltPassword;
        return finalPassword;
    }


    //2.生成加盐的密码（重载）
    public static String encrypt(String password,String salt){
        //生成一个加盐之后的密码
        String saltPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes());
        //生成最终的密码
        String finalPassword=salt+"$"+saltPassword;
        return finalPassword;
    }
    //3.验证密码
    public static boolean check(String inputPassword,String finalPassword){
        if(StringUtils.hasLength(inputPassword)&&StringUtils.hasLength(finalPassword)&&finalPassword.length()==65){
            //1.得到盐值
            //$是关键字  需要转义
            String salt=finalPassword.split("\\$")[0];
            //2.将明文密码按照加密步骤加密，生成最终的密码
            String confirmPassword=PasswordUtils.encrypt(inputPassword,salt);
            //3.对比两个密码是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;
    }

    public static void main(String[] args) {
        String password="123456";
        System.out.println("加盐后的最终密码：" +PasswordUtils.encrypt(password));
        System.out.println(PasswordUtils.check(password,PasswordUtils.encrypt(password)));
    }
}
